package com.thread.threadfirst.studyThread3;

import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 5、Queue
 * ConcurrentLinkedQueue是并发的链表容器（先入先出、单向链表），即它的每个方法都是同步的 线程安全的。
 * <p>
 * 这里为什么用LinkedQueue 不用ArrayQueue呢，是因为array是有容量限制的，如果超出了add()方法就会抛异常。而offer()不会抛异常，它的返回值是boolean类型的，
 * 可通过返回值判断是否加成功。而LinkedQueue是无界队列，即没有容量限制，只要有内存就可以一直加，什么时候内存耗完了什么时候出错。
 */
public class T3 {
    public static void main(String[] args) {
        Queue<String> str = new ConcurrentLinkedQueue<>();
        for (int i = 0; i < 10; i++) {
            str.offer("a" + i);  //相当于add()
        }
        System.out.println(str);
        System.out.println(str.size());

        System.out.println("============");
        System.out.println(str.poll());  //poll()是从容器中拿第一个元素并返回 如果什么都没有就返回null（要保证容器中不存在null的元素），并将其元素在容器中删掉。
        //poll()的底层实现是CAS（Compare and Swap，即比较再交换） 不是加锁的实现，效率高好多。
        System.out.println(str.size());

        System.out.println(str.peek());  //peek()也是从容器中拿第一个元素并返回 如果什么都没有就返回null（要保证容器中不存在null的元素），但与poll()不同的是 peek()不会将其元素在容器中删掉。
        System.out.println(str.size());

        //双端队列 Deque 双向链表可以从两边都加，也可以从两边都往出拿。
    }


}
